sysroot: Add ostree_sysroot_write_deployments_with_options()
authorColin Walters <walters@verbum.org>
Mon, 20 Mar 2017 14:19:04 +0000 (10:19 -0400)
committerAtomic Bot <atomic-devel@projectatomic.io>
Thu, 23 Mar 2017 19:28:42 +0000 (19:28 +0000)
More sophisticated users of libostree like rpm-ostree need control over things
like the system repository. Previously we introduced a "no cleanup" flag to
`ostree_sysroot_simple_write_deployment()`, but that's a high level API that
does filtering on its own.

Since rpm-ostree needs more control, let's expose the bare essentials of the
"sysroot commit" operation with an extensible options structure, where one of
the options is whether or not to do post-transaction repository operations.

Closes: #745
Approved by: jlebon

apidoc/ostree-sections.txt
src/libostree/libostree.sym
src/libostree/ostree-sysroot-deploy.c
src/libostree/ostree-sysroot-private.h
src/libostree/ostree-sysroot.c
src/libostree/ostree-sysroot.h

index c323065f35b5ea60191035b5119dca31df6f3bc2..6f0cf4a826adf10ab3873d7a8b925b6bfdee7c48 100644 (file)
@@ -473,6 +473,7 @@ ostree_sysroot_deployment_set_kargs
 ostree_sysroot_deployment_set_mutable
 ostree_sysroot_deployment_unlock
 ostree_sysroot_write_deployments
+ostree_sysroot_write_deployments_with_options
 ostree_sysroot_write_origin_file
 ostree_sysroot_deploy_tree
 ostree_sysroot_get_merge_deployment
index 8530bc75dece5f1003bda489d725788cf21e3560..749b0c3670d797bf6655c82081401065f16a82f7 100644 (file)
@@ -391,6 +391,7 @@ global:
   ostree_check_version;
   ostree_diff_dirs_with_options;
   ostree_sepolicy_new_at;
+  ostree_sysroot_write_deployments_with_options;
 } LIBOSTREE_2017.3;
 
 /* Stub section for the stable release *after* this development one; don't
index 45707fe7b2ac13107943f3ea8c37a4060d40f98c..acbf4619f2710accfe5092432939b42e35a00be6 100644 (file)
@@ -1686,8 +1686,8 @@ is_ro_mount (const char *path)
  * @cancellable: Cancellable
  * @error: Error
  *
- * Assuming @new_deployments have already been deployed in place on
- * disk, atomically update bootloader configuration.
+ * Older version of ostree_sysroot_write_deployments_with_options(). This
+ * version will perform post-deployment cleanup by default.
  */
 gboolean
 ostree_sysroot_write_deployments (OstreeSysroot     *self,
@@ -1695,16 +1695,32 @@ ostree_sysroot_write_deployments (OstreeSysroot     *self,
                                   GCancellable      *cancellable,
                                   GError           **error)
 {
-  return _ostree_sysroot_write_deployments_internal (self, new_deployments,
-                                                     TRUE, cancellable, error);
+  OstreeSysrootWriteDeploymentsOpts opts = { .do_postclean = TRUE };
+  return ostree_sysroot_write_deployments_with_options (self, new_deployments, &opts,
+                                                        cancellable, error);
 }
 
+/**
+ * ostree_sysroot_write_deployments_with_options:
+ * @self: Sysroot
+ * @new_deployments: (element-type OstreeDeployment): List of new deployments
+ * @opts: Options
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * Assuming @new_deployments have already been deployed in place on disk via
+ * ostree_sysroot_deploy_tree(), atomically update bootloader configuration. By
+ * default, no post-transaction cleanup will be performed. You should invoke
+ * ostree_sysroot_cleanup() at some point after the transaction, or specify
+ * `do_postclean` in @opts.  Skipping the post-transaction cleanup is useful
+ * if for example you want to control pruning of the repository.
+ */
 gboolean
-_ostree_sysroot_write_deployments_internal (OstreeSysroot     *self,
-                                            GPtrArray         *new_deployments,
-                                            gboolean           do_clean,
-                                            GCancellable      *cancellable,
-                                            GError           **error)
+ostree_sysroot_write_deployments_with_options (OstreeSysroot     *self,
+                                               GPtrArray         *new_deployments,
+                                               OstreeSysrootWriteDeploymentsOpts *opts,
+                                               GCancellable      *cancellable,
+                                               GError           **error)
 {
   gboolean ret = FALSE;
   guint i;
@@ -1930,7 +1946,7 @@ _ostree_sysroot_write_deployments_internal (OstreeSysroot     *self,
 
   /* And finally, cleanup of any leftover data.
    */
-  if (do_clean)
+  if (opts->do_postclean)
     {
       if (!ostree_sysroot_cleanup (self, cancellable, error))
         {
index 18fc0cb05e634dc9ebc61071538e2209ce934041..c2f5d2d97d51a60f1a438fc44bd67932f041a59a 100644 (file)
@@ -114,10 +114,4 @@ gboolean _ostree_sysroot_cleanup_internal (OstreeSysroot *sysroot,
                                            GCancellable  *cancellable,
                                            GError       **error);
 
-gboolean _ostree_sysroot_write_deployments_internal (OstreeSysroot     *self,
-                                                     GPtrArray         *new_deployments,
-                                                     gboolean           do_clean,
-                                                     GCancellable      *cancellable,
-                                                     GError           **error);
-
 G_END_DECLS
index 575cb6dfe781b4a509dd717e2b4d91440c03b839..c4f608a2881e69fe9ed69cfd00e1d3cc1b3f641d 100644 (file)
@@ -1553,6 +1553,7 @@ ostree_sysroot_simple_write_deployment (OstreeSysroot      *sysroot,
   g_autoptr(GPtrArray) deployments = NULL;
   g_autoptr(GPtrArray) new_deployments = g_ptr_array_new_with_free_func (g_object_unref);
   const gboolean postclean = (flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN) == 0;
+  OstreeSysrootWriteDeploymentsOpts write_opts = { .do_postclean = postclean };
   gboolean retain = (flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN) > 0;
   const gboolean make_default = !((flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT) > 0);
   gboolean added_new = FALSE;
@@ -1603,8 +1604,8 @@ ostree_sysroot_simple_write_deployment (OstreeSysroot      *sysroot,
       added_new = TRUE;
     }
 
-  if (!_ostree_sysroot_write_deployments_internal (sysroot, new_deployments,
-                                                   postclean, cancellable, error))
+  if (!ostree_sysroot_write_deployments_with_options (sysroot, new_deployments, &write_opts,
+                                                      cancellable, error))
     goto out;
 
   ret = TRUE;
index 1e98cc10e338229fe6200995ea993703b93e506c..09614b555261faa83d84a1924956b51837460d27 100644 (file)
@@ -145,6 +145,20 @@ gboolean ostree_sysroot_write_deployments (OstreeSysroot     *self,
                                            GCancellable      *cancellable,
                                            GError           **error);
 
+typedef struct {
+  gboolean do_postclean;
+  gboolean unused_bools[7];
+  int unused_ints[7];
+  gpointer unused_ptrs[7];
+} OstreeSysrootWriteDeploymentsOpts;
+
+_OSTREE_PUBLIC
+gboolean ostree_sysroot_write_deployments_with_options (OstreeSysroot     *self,
+                                                        GPtrArray         *new_deployments,
+                                                        OstreeSysrootWriteDeploymentsOpts *opts,
+                                                        GCancellable      *cancellable,
+                                                        GError           **error);
+
 _OSTREE_PUBLIC
 gboolean ostree_sysroot_deploy_tree (OstreeSysroot     *self,
                                      const char        *osname,